<!DOCTYPE html>



  


<html class="theme-next pisces use-motion" lang="zh-Hans">
<head><meta name="generator" content="Hexo 3.8.0">
  <meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta name="theme-color" content="#222">









<meta http-equiv="Cache-Control" content="no-transform">
<meta http-equiv="Cache-Control" content="no-siteapp">
















  
  
  <link href="/lib/fancybox/source/jquery.fancybox.css?v=2.1.5" rel="stylesheet" type="text/css">




  
  
  
  

  
    
    
  

  

  

  

  

  
    
    
    <link href="//fonts.googleapis.com/css?family=Lato:300,300italic,400,400italic,700,700italic&subset=latin,latin-ext" rel="stylesheet" type="text/css">
  






<link href="/lib/font-awesome/css/font-awesome.min.css?v=4.6.2" rel="stylesheet" type="text/css">

<link href="/css/main.css?v=5.1.4" rel="stylesheet" type="text/css">


  <link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon-next.png?v=5.1.4">


  <link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32-next.png?v=5.1.4">


  <link rel="icon" type="image/png" sizes="16x16" href="/images/favicon-16x16-next.png?v=5.1.4">


  <link rel="mask-icon" href="/images/logo.svg?v=5.1.4" color="#222">





  <meta name="keywords" content="RabbitMQ,主题模式Topic,直接模式Direct,分列模式（Fanout),AMQP,Erlang,">










<meta name="description" content="消息中间件RabbitMQ的使用以及基本概念">
<meta name="keywords" content="RabbitMQ,主题模式Topic,直接模式Direct,分列模式（Fanout),AMQP,Erlang">
<meta property="og:type" content="article">
<meta property="og:title" content="消息中间件RabbitMQ的使用以及基本概念">
<meta property="og:url" content="https://www.babywang.huangsm.xyz/2019/01/26/消息中间件RabbitMQ的使用以及基本概念/index.html">
<meta property="og:site_name" content="babybabywang">
<meta property="og:description" content="消息中间件RabbitMQ的使用以及基本概念">
<meta property="og:locale" content="zh-Hans">
<meta property="og:image" content="https://www.babywang.huangsm.xyz/2019/01/26/消息中间件RabbitMQ的使用以及基本概念/RabbitMq架构图.png">
<meta property="og:image" content="https://www.babywang.huangsm.xyz/2019/01/26/消息中间件RabbitMQ的使用以及基本概念/启动RabbitMq.png">
<meta property="og:image" content="https://www.babywang.huangsm.xyz/2019/01/26/消息中间件RabbitMQ的使用以及基本概念/RabbitMq启动页面.png">
<meta property="og:image" content="https://www.babywang.huangsm.xyz/2019/01/26/消息中间件RabbitMQ的使用以及基本概念/直接模式Direct.png">
<meta property="og:image" content="https://www.babywang.huangsm.xyz/2019/01/26/消息中间件RabbitMQ的使用以及基本概念/创建队列.png">
<meta property="og:image" content="https://www.babywang.huangsm.xyz/2019/01/26/消息中间件RabbitMQ的使用以及基本概念/直接模式消息接收情况.png">
<meta property="og:image" content="https://www.babywang.huangsm.xyz/2019/01/26/消息中间件RabbitMQ的使用以及基本概念/消费者测试.png">
<meta property="og:image" content="https://www.babywang.huangsm.xyz/2019/01/26/消息中间件RabbitMQ的使用以及基本概念/分列模式图.png">
<meta property="og:image" content="https://www.babywang.huangsm.xyz/2019/01/26/消息中间件RabbitMQ的使用以及基本概念/添加交换机.png">
<meta property="og:image" content="https://www.babywang.huangsm.xyz/2019/01/26/消息中间件RabbitMQ的使用以及基本概念/绑定Queue.png">
<meta property="og:image" content="https://www.babywang.huangsm.xyz/2019/01/26/消息中间件RabbitMQ的使用以及基本概念/分列模式消息消费者.png">
<meta property="og:image" content="https://www.babywang.huangsm.xyz/2019/01/26/消息中间件RabbitMQ的使用以及基本概念/topic模式.png">
<meta property="og:image" content="https://www.babywang.huangsm.xyz/2019/01/26/消息中间件RabbitMQ的使用以及基本概念/新建topic交换机.png">
<meta property="og:image" content="https://www.babywang.huangsm.xyz/2019/01/26/消息中间件RabbitMQ的使用以及基本概念/绑定routingkey.png">
<meta property="og:image" content="https://www.babywang.huangsm.xyz/2019/01/26/消息中间件RabbitMQ的使用以及基本概念/Topic模式测试结果.png">
<meta property="og:image" content="https://www.babywang.huangsm.xyz/2019/01/26/消息中间件RabbitMQ的使用以及基本概念/Rabbit主题模式.png">
<meta property="og:updated_time" content="2019-01-26T07:55:21.695Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="消息中间件RabbitMQ的使用以及基本概念">
<meta name="twitter:description" content="消息中间件RabbitMQ的使用以及基本概念">
<meta name="twitter:image" content="https://www.babywang.huangsm.xyz/2019/01/26/消息中间件RabbitMQ的使用以及基本概念/RabbitMq架构图.png">



<script type="text/javascript" id="hexo.configurations">
  var NexT = window.NexT || {};
  var CONFIG = {
    root: '/',
    scheme: 'Pisces',
    version: '5.1.4',
    sidebar: {"position":"left","display":"post","offset":12,"b2t":false,"scrollpercent":false,"onmobile":false},
    fancybox: true,
    tabs: true,
    motion: {"enable":true,"async":false,"transition":{"post_block":"fadeIn","post_header":"slideDownIn","post_body":"slideDownIn","coll_header":"slideLeftIn","sidebar":"slideUpIn"}},
    duoshuo: {
      userId: '0',
      author: 'Author'
    },
    algolia: {
      applicationID: '',
      apiKey: '',
      indexName: '',
      hits: {"per_page":10},
      labels: {"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"}
    }
  };
</script>



  <link rel="canonical" href="https://www.babywang.huangsm.xyz/2019/01/26/消息中间件RabbitMQ的使用以及基本概念/">





  <title>消息中间件RabbitMQ的使用以及基本概念 | babybabywang</title>
  








</head>
<!-- С���� <script type="text/javascript" src="/js/src/love.js"></script> -->

<body itemscope="" itemtype="http://schema.org/WebPage" lang="zh-Hans">

  
  
    
  

  <div class="container sidebar-position-left page-post-detail">
    <div class="headband"></div>
		<a href="https://github.com/babybabywang" class="github-corner" aria-label="View source on GitHub"><svg width="80" height="80" viewbox="0 0 250 250" style="fill:#151513; color:#fff; position: absolute; top: 0; border: 0; left: 0; transform: scale(-1, 1);" aria-hidden="true"><path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"/><path d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor" style="transform-origin: 130px 106px;" class="octo-arm"/><path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z" fill="currentColor" class="octo-body"/></svg><style>.github-corner:hover .octo-arm{animation:octocat-wave 560ms ease-in-out}@keyframes octocat-wave{0%,100%{transform:rotate(0)}20%,60%{transform:rotate(-25deg)}40%,80%{transform:rotate(10deg)}}@media (max-width:500px){.github-corner:hover .octo-arm{animation:none}.github-corner .octo-arm{animation:octocat-wave 560ms ease-in-out}}</style></a>

    <header id="header" class="header" itemscope="" itemtype="http://schema.org/WPHeader">
      <div class="header-inner"><div class="site-brand-wrapper">
  <div class="site-meta ">
    

    <div class="custom-logo-site-title">
      <a href="/" class="brand" rel="start">
        <span class="logo-line-before"><i></i></span>
        <span class="site-title">babybabywang</span>
        <span class="logo-line-after"><i></i></span>
      </a>
    </div>
      
        <p class="site-subtitle"></p>
      
  </div>

  <div class="site-nav-toggle">
    <button>
      <span class="btn-bar"></span>
      <span class="btn-bar"></span>
      <span class="btn-bar"></span>
    </button>
  </div>
</div>

<nav class="site-nav">
  

  
    <ul id="menu" class="menu">
      
        
        <li class="menu-item menu-item-home">
          <a href="/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-home"></i> <br>
            
            首页
          </a>
        </li>
      
        
        <li class="menu-item menu-item-about">
          <a href="/about/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-user"></i> <br>
            
            关于
          </a>
        </li>
      
        
        <li class="menu-item menu-item-tags">
          <a href="/tags/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-tags"></i> <br>
            
            标签
          </a>
        </li>
      
        
        <li class="menu-item menu-item-categories">
          <a href="/categories/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-th"></i> <br>
            
            分类
          </a>
        </li>
      
        
        <li class="menu-item menu-item-archives">
          <a href="/archives/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-archive"></i> <br>
            
            归档
          </a>
        </li>
      

      
        <li class="menu-item menu-item-search">
          
            <a href="javascript:;" class="popup-trigger">
          
            
              <i class="menu-item-icon fa fa-search fa-fw"></i> <br>
            
            搜索
          </a>
        </li>
      
    </ul>
  

  
    <div class="site-search">
      
  <div class="popup search-popup local-search-popup">
  <div class="local-search-header clearfix">
    <span class="search-icon">
      <i class="fa fa-search"></i>
    </span>
    <span class="popup-btn-close">
      <i class="fa fa-times-circle"></i>
    </span>
    <div class="local-search-input-wrapper">
      <input autocomplete="off" placeholder="搜索..." spellcheck="false" type="text" id="local-search-input">
    </div>
  </div>
  <div id="local-search-result"></div>
</div>



    </div>
  
</nav>



 </div>
    </header>

    <main id="main" class="main">
      <div class="main-inner">
        <div class="content-wrap">
          <div id="content" class="content">
            

  <div id="posts" class="posts-expand">
    

  

  
  
  

  <article class="post post-type-normal" itemscope="" itemtype="http://schema.org/Article">
  
  
  
  <div class="post-block">
    <link itemprop="mainEntityOfPage" href="https://www.babywang.huangsm.xyz/2019/01/26/消息中间件RabbitMQ的使用以及基本概念/">

    <span hidden itemprop="author" itemscope="" itemtype="http://schema.org/Person">
      <meta itemprop="name" content="huangsm">
      <meta itemprop="description" content="">
      <meta itemprop="image" content="/blogHead.jpg">
    </span>

    <span hidden itemprop="publisher" itemscope="" itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="babybabywang">
    </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">消息中间件RabbitMQ的使用以及基本概念</h1>
        

        <div class="post-meta">
          <span class="post-time">
            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              
                <span class="post-meta-item-text">发表于</span>
              
              <time title="创建于" itemprop="dateCreated datePublished" datetime="2019-01-26T12:14:23+08:00">
                2019-01-26
              </time>
            

            

            
          </span>

          
            <span class="post-category">
            
              <span class="post-meta-divider">|</span>
            
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              
                <span class="post-meta-item-text">分类于</span>
              
              
                <span itemprop="about" itemscope="" itemtype="http://schema.org/Thing">
                  <a href="/categories/RabbitMQ/" itemprop="url" rel="index">
                    <span itemprop="name">RabbitMQ</span>
                  </a>
                </span>

                
                
              
            </span>
          

          
            
          

          
          

          
            <span class="post-meta-divider">|</span>
            <span class="page-pv"><i class="fa fa-file-o"></i>
            <span class="busuanzi-value" id="busuanzi_value_page_pv"></span>
            </span>
          

          
            <div class="post-wordcount">
              
                
                <span class="post-meta-item-icon">
                  <i class="fa fa-file-word-o"></i>
                </span>
                
                  <span class="post-meta-item-text">字数统计&#58;</span>
                
                <span title="字数统计">
                  3k
                </span>
              

              

              
            </div>
          

          
              <div class="post-description">
                  消息中间件RabbitMQ的使用以及基本概念
              </div>
          

        </div>
      </header>
    

    
    
    
    <div class="post-body" itemprop="articleBody">

      
      

      
        <h1 id="RabbitMQ"><a href="#RabbitMQ" class="headerlink" title="RabbitMQ"></a>RabbitMQ</h1><h2 id="RabbitMQ简介"><a href="#RabbitMQ简介" class="headerlink" title="RabbitMQ简介"></a>RabbitMQ简介</h2><ol>
<li><p>消息队列中间件简介</p>
<pre><code>  消息队列中间件是分布式系统中重要的组件，主要解决应用耦合，异步消息，流量削锋等问题实现高性能，高可用，可伸缩和
最终一致性[架构]使用较多的消息队列有ActiveMQ，RabbitMQ，ZeroMQ，Kafka，MetaMQ，RocketMQ

以下介绍消息队列在实际应用中常用的使用场景：异步处理，应用解耦，流量削锋和消息通讯四个场景
</code></pre><p><em>速度:kafka、rabbitmq、activemq</em><br><br><em>最安全的是:activemq</em></p>
</li>
<li><p>什么是RabbitMQ</p>
<pre><code>RabbitMQ 是一个由 Erlang 语言开发的 AMQP 的开源实现。
AMQP ：Advanced Message Queue，高级消息队列协议。它是应用层协议的一个开放
标准，为面向消息的中间件设计，基于此协议的客户端与消息中间件可传递消息，并不
受产品、开发语言等条件的限制。
RabbitMQ 最初起源于金融系统，用于在分布式系统中存储转发消息，在易用性、扩展
性、高可用性等方面表现不俗。具体特点包括：

1.可靠性（Reliability）

RabbitMQ 使用一些机制来保证可靠性，如持久化、传输确认、发布确认。

2.灵活的路由（Flexible Routing）

在消息进入队列之前，通过 Exchange 来路由消息的。对于典型的路由功能，RabbitMQ
已经提供了一些内置的 Exchange 来实现。针对更复杂的路由功能，可以将多个
Exchange 绑定在一起，也通过插件机制实现自己的 Exchange 。

3.消息集群（Clustering）

多个 RabbitMQ 服务器可以组成一个集群，形成一个逻辑 Broker 。

4.高可用（Highly Available Queues）

队列可以在集群中的机器上进行镜像，使得在部分节点出问题的情况下队列仍然可用。

5.多种协议（Multi-protocol）

RabbitMQ 支持多种消息队列协议，比如 STOMP、MQTT 等等。

6.多语言客户端（Many Clients）

RabbitMQ 几乎支持所有常用语言，比如 Java、.NET、Ruby 等等。

7.管理界面（Management UI）

RabbitMQ 提供了一个易用的用户界面，使得用户可以监控和管理消息 Broker 的许多方
面。

8.跟踪机制（Tracing）

如果消息异常，RabbitMQ 提供了消息跟踪机制，使用者可以找出发生了什么。

9.插件机制（Plugin System）

RabbitMQ 提供了许多插件，来从多方面进行扩展，也可以编写自己的插件
</code></pre></li>
<li><p>架构图与主要概念</p>
</li>
</ol>
<p><strong>RabbitMQ架构图</strong><br><img src="/2019/01/26/消息中间件RabbitMQ的使用以及基本概念/RabbitMq架构图.png" alt="RabbitMq架构图"></p>
<p><strong>主要概念</strong></p>
<pre><code>RabbitMQ Server： 也叫broker server，它是一种传输服务。 他的角色就是维护一条
从Producer到Consumer的路线，保证数据能够按照指定的方式进行传输。

Producer： 消息生产者，如图A、B、C，数据的发送方。消息生产者连接RabbitMQ服
务器然后将消息投递到Exchange。

Consumer：消息消费者，如图1、2、3，数据的接收方。消息消费者订阅队列，
RabbitMQ将Queue中的消息发送到消息消费者。

Exchange：生产者将消息发送到Exchange（交换器），由Exchange将消息路由到一个
或多个Queue中（或者丢弃）。Exchange并不存储消息。RabbitMQ中的Exchange有
direct、fanout、topic、headers四种类型，每种类型对应不同的路由规则。

Queue：（队列）是RabbitMQ的内部对象，用于存储消息。消息消费者就是通过订阅
队列来获取消息的，RabbitMQ中的消息都只能存储在Queue中，生产者生产消息并最终
投递到Queue中，消费者可以从Queue中获取消息并消费。多个消费者可以订阅同一个
Queue，这时Queue中的消息会被平均分摊给多个消费者进行处理，而不是每个消费者
都收到所有的消息并处理。

RoutingKey：生产者在将消息发送给Exchange的时候，一般会指定一个routing key，
来指定这个消息的路由规则，而这个routing key需要与Exchange Type及binding key联
合使用才能最终生效。在Exchange Type与binding key固定的情况下（在正常使用时一
般这些内容都是固定配置好的），我们的生产者就可以在发送消息给Exchange时，通过
指定routing key来决定消息流向哪里。RabbitMQ为routing key设定的长度限制为255
bytes

Connection： （连接）：Producer和Consumer都是通过TCP连接到RabbitMQ Server
的。以后我们可以看到，程序的起始处就是建立这个TCP连接。

Channels： （信道）：它建立在上述的TCP连接中。数据流动都是在Channel中进行
的。也就是说，一般情况是程序起始建立TCP连接，第二步就是建立这个Channel。

VirtualHost：权限控制的基本单位，一个VirtualHost里面有若干Exchange和
MessageQueue，以及指定被哪些user使用
</code></pre><h2 id="RabbitMQ的使用"><a href="#RabbitMQ的使用" class="headerlink" title="RabbitMQ的使用"></a>RabbitMQ的使用</h2><ol>
<li><p>RabbitMQ安装与启动</p>
<p> <strong>一、windows环境下的安装</strong></p>
<pre><code>（1）下载并安装 Eralng配套软件中已提供otp_win64_20.2.exe （以管理员身份运行安装）
（2）下载并安装rabbitmq配套软件中已提供rabbitmq-server-3.7.4.exe。双击安装，注意不要安装在包含
    中文和空格的目录下！安装后window服务中就存在rabbitMQ了，并且是启动状态。
（3）安装管理界面（插件）进入rabbitMQ安装目录的sbin目录，输入命令
    rabbitmq‐plugins enable rabbitmq_management
（4）重新启动服务
（5）打开浏览器，地址栏输入http://127.0.0.1:15672 ,即可看到管理界面的登陆页
</code></pre><p> <strong>二、docker容器中按照RabbitMQ</strong></p>
<pre><code>（1）拉去rabbitMQ镜像
    docker pull rabbitmq:management
（2）创建容器，rabbitmq需要有映射以下端口: 5671 5672 4369 15671 15672 25672
    15672 (if management plugin is enabled)
    15671 management监听端口
    5672, 5671 (AMQP 0-9-1 without and with TLS)
    4369 (epmd) epmd 代表 Erlang 端口映射守护进程
    25672 (Erlang distribution)

(3)启动容器:
docker run -d --name=myrabbitmq -p 5671:5671 -p 5672:5672 -p 4369:4369 -p 15671:15671 -p 15672:15672 -p 25672:25672 d69a5113ceae
</code></pre></li>
</ol>
<p><em>输入<a href="http://192.168.25.133:15672进入RabbitMQ登录页面" target="_blank" rel="noopener">http://192.168.25.133:15672进入RabbitMQ登录页面</a></em></p>
<p><img src="/2019/01/26/消息中间件RabbitMQ的使用以及基本概念/启动RabbitMq.png" alt="启动RabbitMq"><br></p>
<p><em>输入用户名和密码，都为guest 进入主界</em></p>
<p><img src="/2019/01/26/消息中间件RabbitMQ的使用以及基本概念/RabbitMq启动页面.png" alt="RabbitMq启动页面"><br></p>
<p><strong>最上侧的导航以此是：概览、连接、信道、交换器、队列、用户管理</strong></p>
<ol start="2">
<li><p>直接模式(Direct)</p>
<pre><code>一、什么是Direct模式
我们需要将消息发给唯一一个节点时使用这种模式，这是最简单的一种形式。

任何发送到Direct Exchange的消息都会被转发到RouteKey中指定的Queue。
1.一般情况可以使用rabbitMQ自带的Exchange：&quot;&quot;(该Exchange的名字为空字符串，下
文称其为default Exchange)。
2.这种模式下不需要将Exchange进行任何绑定(binding)操作
3.消息传递时需要一个“RouteKey”，可以简单的理解为要发送到的队列名字。
4.如果vhost中不存在RouteKey中指定的队列名，则该消息会被抛弃。
</code></pre></li>
</ol>
<p><img src="/2019/01/26/消息中间件RabbitMQ的使用以及基本概念/直接模式Direct.png" alt="直接模式Direct"></p>
<pre><code>二、创建队列
做下面的例子前，我们先建立一个叫myQue的队列

Durability：是否做持久化 Durable（持久） transient（临时）
Auto delete : 是否自动删除
</code></pre><p><img src="/2019/01/26/消息中间件RabbitMQ的使用以及基本概念/创建队列.png" alt="创建队列">    </p>
<pre><code>三、代码实现-消息生产者
1.引入依赖
&lt;dependency&gt;
    &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
    &lt;artifactId&gt;spring-boot-starter-amqp&lt;/artifactId&gt;
&lt;/dependency&gt;
2.编写配置文件application.yml

spring:
  rabbitmq:
    host: 192.168.25.133

3.编写测试类

@Autowired
private RabbitTemplate rabbitTemplate;

@Test
public void contextLoads() {
    /**
     * 第一个参数是队列名也就是routingKey
     */
    rabbitTemplate.convertAndSend(&quot;myQue&quot;,&quot;测试下直接模式(Direct)&quot;);
}
</code></pre><p><img src="/2019/01/26/消息中间件RabbitMQ的使用以及基本概念/直接模式消息接收情况.png" alt="直接模式消息接收情况">    </p>
<pre><code>四、代码实现-消息消费者
（1）编写消息消费者类
@Component                            
@RabbitListener(queues = &quot;myQue&quot;)
public class Customer {
    @RabbitHandler
    public void showMessage(String msg){
        System.out.println(&quot;myQue接收的消息:&quot;+msg);
    }
}    
(2)运行启动类，可以在控制台看到刚才发送的消息
</code></pre><p><img src="/2019/01/26/消息中间件RabbitMQ的使用以及基本概念/消费者测试.png" alt="消费者测试"></p>
<p><strong>利用IDEA启用俩个消费者实例，在利用生产者发送消息，多次测试后发现俩个消费者实例收到消息的比例相同为1:1（负载均衡）</strong></p>
<ol start="2">
<li><p>分列模式（Fanout）</p>
<pre><code>一、什么是分列（Fanout）模式
当我们需要将消息一次发给多个队列时，需要使用这种模式。

任何发送到Fanout Exchange的消息都会被转发到与该Exchange绑定(Binding)的所有
Queue上。
1.可以理解为路由表的模式
2.这种模式不需要RouteKey
3.这种模式需要提前将Exchange与Queue进行绑定，一个Exchange可以绑定多个
Queue，一个Queue可以同多个Exchange进行绑定。
4.如果接受到消息的Exchange没有与任何Queue绑定，则消息会被抛弃。
</code></pre></li>
</ol>
<p><img src="/2019/01/26/消息中间件RabbitMQ的使用以及基本概念/分列模式图.png" alt="分列模式图"></p>
<p><strong>创建交换机</strong></p>
<p><img src="/2019/01/26/消息中间件RabbitMQ的使用以及基本概念/添加交换机.png" alt="添加交换机"></p>
<p><strong>绑定QUEUE</strong></p>
<p><img src="/2019/01/26/消息中间件RabbitMQ的使用以及基本概念/绑定Queue.png" alt="绑定Queue"></p>
<pre><code>二、代码实现---分列模式消息生产者

     /**
        *
      * 分列模式(Fanout)
      */

    @Test
    public void sendMsg2() {
        /**
         * 第一个参数是交换机名称，第二个队列名称是routingkey
         */
        rabbitTemplate.convertAndSend(&quot;huangsm&quot;,&quot;&quot;,&quot;测试分列模式(Fanout)&quot;);
    }

三、代码实现-分列模式消息消费者
@Component
@RabbitListener(queues = &quot;myQue2&quot;)
public class Customer2 {
    @RabbitHandler
    public void showMessage(String msg){
        System.out.println(&quot;myQue3接收的消息:&quot;+msg);
    }
}
</code></pre><p><img src="/2019/01/26/消息中间件RabbitMQ的使用以及基本概念/分列模式消息消费者.png" alt="分列模式消息消费者"></p>
<ol start="3">
<li><p>主题模式（Topic）</p>
<pre><code>一、什么是主题模式
任何发送到Topic Exchange的消息都会被转发到所有关心RouteKey中指定话题的Queue上
</code></pre></li>
</ol>
<p><img src="/2019/01/26/消息中间件RabbitMQ的使用以及基本概念/topic模式.png" alt="topic模式">        </p>
<pre><code>由上图看出:
此类交换器使得来自不同的源头的消息可以到达一个队列，其实说的更明白一点就是模
糊匹配的意思，例如：上图中红色对列的routekey为usa.#，#代表匹配任意字符，但是
要想消息能到达此对列，usa.必须匹配后面的#好可以随意。图中usa.news
usa.weather,都能找到红色队列，符号 # 匹配一个或多个词，符号 * 匹配不多不少一个
词。因此 usa.# 能够匹配到 usa.news.XXX ，但是 usa.* 只会匹配到 usa.XXX 。
注：
交换器说到底是一个名称与队列绑定的列表。当消息发布到交换器时，实际上是由你所
连接的信道，将消息路由键同交换器上绑定的列表进行比较，最后路由消息。
任何发送到Topic Exchange的消息都会被转发到所有关心RouteKey中指定话题的
Queue上

1.这种模式较为复杂，简单来说，就是每个队列都有其关心的主题，所有的消息都带有一
个“标题”(RouteKey)，Exchange会将消息转发到所有关注主题能与RouteKey模糊匹配的
队列。

2.这种模式需要RouteKey，也许要提前绑定Exchange与Queue。

3.在进行绑定时，要提供一个该队列关心的主题，如“#.log.#”表示该队列关心所有涉及
log的消息(一个RouteKey为”MQ.log.error”的消息会被转发到该队列)。

4.“#”表示0个或若干个关键字，“”表示一个关键字。如“log.”能与“log.warn”匹配，无法
与“log.warn.timeout”匹配；但是“log.#”能与上述两者匹配。

5.同样，如果Exchange没有发现能够与RouteKey匹配的Queue，则会抛弃此消息
</code></pre><p><strong>创建队列与绑定</strong></p>
<p>（1）新建一个交换器 ，类型选择topic</p>
<p><img src="/2019/01/26/消息中间件RabbitMQ的使用以及基本概念/新建topic交换机.png" alt="新建topic交换机"></p>
<p>（2）点击新建的交换器topichuang,添加匹配规则，添加后列表如下：</p>
<p><img src="/2019/01/26/消息中间件RabbitMQ的使用以及基本概念/绑定routingkey.png" alt="绑定routingkey"></p>
<p><strong>消息生产者代码已经消费者测试结果</strong></p>
<pre><code>/**
 * 测试主题模式(topic)
*/
     @Test
 public void sendMsg3() {
     /**
      * 第一个参数是交换机名称，第二个队列名称是routingKey
      */
     rabbitTemplate.convertAndSend(&quot;topichuang&quot;,&quot;huang.aaa&quot;,&quot;aaa消息发送给谁呢&quot;);
 }
 /**
  * 测试主题模式(topic)
  */
 @Test
 public void sendMsg4() {
     /**
      * 第一个参数是交换机名称，第二个队列名称是routingKey
      */
     rabbitTemplate.convertAndSend(&quot;topichuang&quot;,&quot;huang.log&quot;,&quot;huang.log消息发送给谁呢&quot;);
 }

 /**
  * 测试主题模式(topic)
  */
 @Test
 public void sendMsg5() {
     /**
      * 第一个参数是交换机名称，第二个队列名称是routingKey
      */
     rabbitTemplate.convertAndSend(&quot;topichuang&quot;,&quot;log.ccc&quot;,&quot;ccc消息发送给谁呢&quot;);
 }
</code></pre><p><em>Topic模式测试结果</em></p>
<p><img src="/2019/01/26/消息中间件RabbitMQ的使用以及基本概念/Topic模式测试结果.png" alt="Topic模式测试结果"></p>
<p><em>Topic模式流程图</em></p>
<p><img src="/2019/01/26/消息中间件RabbitMQ的使用以及基本概念/Rabbit主题模式.png" alt="Rabbit主题模式"></p>
<h2 id="结束语"><a href="#结束语" class="headerlink" title="结束语"></a>结束语</h2><p><strong>这篇博客主要讲述RabbitMQ的一些概念和一些操作方式，下篇博客会介绍RabbitMQ的实战，开发一个用户微服务</strong></p>

      
    </div>
    
    
    

    

    
      <div>
        <div style="padding: 10px 0; margin: 20px auto; width: 90%; text-align: center;">
  <div>Adhere to the original technology sharing, your support will encourage me to continue to create!</div>
  <button id="rewardButton" disable="enable" onclick="var qr = document.getElementById('QR'); if (qr.style.display === 'none') {qr.style.display='block';} else {qr.style.display='none'}">
    <span>打赏</span>
  </button>
  <div id="QR" style="display: none;">

    
      <div id="wechat" style="display: inline-block">
        <img id="wechat_qr" src="/wx.jpg" alt="huangsm 微信支付">
        <p>微信支付</p>
      </div>
    

    
      <div id="alipay" style="display: inline-block">
        <img id="alipay_qr" src="/zfb.jpg" alt="huangsm 支付宝">
        <p>支付宝</p>
      </div>
    

    

  </div>
</div>

      </div>
    

    

    <footer class="post-footer">
      
        <div class="post-tags">
          
            <a href="/tags/RabbitMQ/" rel="tag"><i class="fa fa-tag"></i> RabbitMQ</a>
          
            <a href="/tags/主题模式Topic/" rel="tag"><i class="fa fa-tag"></i> 主题模式Topic</a>
          
            <a href="/tags/直接模式Direct/" rel="tag"><i class="fa fa-tag"></i> 直接模式Direct</a>
          
            <a href="/tags/分列模式（Fanout/" rel="tag"><i class="fa fa-tag"></i> 分列模式（Fanout)</a>
          
            <a href="/tags/AMQP/" rel="tag"><i class="fa fa-tag"></i> AMQP</a>
          
            <a href="/tags/Erlang/" rel="tag"><i class="fa fa-tag"></i> Erlang</a>
          
        </div>
      

      
      
        <div class="post-widgets">
        

        

        
          
          <div id="needsharebutton-postbottom">
            <span class="btn">
              <i class="fa fa-share-alt" aria-hidden="true"></i>
            </span>
          </div>
        
        </div>
      
      

      
        <div class="post-nav">
          <div class="post-nav-next post-nav-item">
            
              <a href="/2019/01/25/docker下部署elasticsearch环境/" rel="next" title="docker下部署elasticsearch环境">
                <i class="fa fa-chevron-left"></i> docker下部署elasticsearch环境
              </a>
            
          </div>

          <span class="post-nav-divider"></span>

          <div class="post-nav-prev post-nav-item">
            
              <a href="/2019/01/26/RabbitMQ在用户微服务开发中的实战/" rel="prev" title="RabbitMQ在用户微服务开发中的实战">
                RabbitMQ在用户微服务开发中的实战 <i class="fa fa-chevron-right"></i>
              </a>
            
          </div>
        </div>
      

      
      
    </footer>
  </div>
  
  
  
  </article>



    <div class="post-spread">
      
    </div>
  </div>


          </div>
          


          

  



        </div>
        
          
  
  <div class="sidebar-toggle">
    <div class="sidebar-toggle-line-wrap">
      <span class="sidebar-toggle-line sidebar-toggle-line-first"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-middle"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-last"></span>
    </div>
  </div>

  <aside id="sidebar" class="sidebar">
    
    <div class="sidebar-inner">

      

      
        <ul class="sidebar-nav motion-element">
          <li class="sidebar-nav-toc sidebar-nav-active" data-target="post-toc-wrap">
            文章目录
          </li>
          <li class="sidebar-nav-overview" data-target="site-overview-wrap">
            站点概览
          </li>
        </ul>
      

      <section class="site-overview-wrap sidebar-panel">
        <div class="site-overview">
          <div class="site-author motion-element" itemprop="author" itemscope="" itemtype="http://schema.org/Person">
            
              <img class="site-author-image" itemprop="image" src="/blogHead.jpg" alt="huangsm">
            
              <p class="site-author-name" itemprop="name">huangsm</p>
              <p class="site-description motion-element" itemprop="description">Make a silk purse out of a self</p>
          </div>

          <nav class="site-state motion-element">

            
              <div class="site-state-item site-state-posts">
              
                <a href="/archives/">
              
                  <span class="site-state-item-count">36</span>
                  <span class="site-state-item-name">日志</span>
                </a>
              </div>
            

            
              
              
              <div class="site-state-item site-state-categories">
                <a href="/categories/index.html">
                  <span class="site-state-item-count">29</span>
                  <span class="site-state-item-name">分类</span>
                </a>
              </div>
            

            
              
              
              <div class="site-state-item site-state-tags">
                <a href="/tags/index.html">
                  <span class="site-state-item-count">104</span>
                  <span class="site-state-item-name">标签</span>
                </a>
              </div>
            

          </nav>

          

          
            <div class="links-of-author motion-element">
                
                  <span class="links-of-author-item">
                    <a href="https://gitee.com/wangyuanbaby" target="_blank" title="Gitee">
                      
                        <i class="fa fa-fw fa-globe"></i>Gitee</a>
                  </span>
                
                  <span class="links-of-author-item">
                    <a href="https://github.com/babybabywang" target="_blank" title="GitHub">
                      
                        <i class="fa fa-fw fa-globe"></i>GitHub</a>
                  </span>
                
                  <span class="links-of-author-item">
                    <a href="https://blog.csdn.net/weixin_36964056" target="_blank" title="CSDN">
                      
                        <i class="fa fa-fw fa-globe"></i>CSDN</a>
                  </span>
                
            </div>
          

          
          

          
          
            <div class="links-of-blogroll motion-element links-of-blogroll-block">
              <div class="links-of-blogroll-title">
                <i class="fa  fa-fw fa-link"></i>
                Links
              </div>
              <ul class="links-of-blogroll-list">
                
                  <li class="links-of-blogroll-item">
                    <a href="https://gitee.com/wangyuanbaby" title="码云🐴" target="_blank">码云🐴</a>
                  </li>
                
                  <li class="links-of-blogroll-item">
                    <a href="http://www.huangsm.xyz:7900/" title="Eureka服务器" target="_blank">Eureka服务器</a>
                  </li>
                
              </ul>
            </div>
          

          

        </div>
      </section>

      
      <!--noindex-->
        <section class="post-toc-wrap motion-element sidebar-panel sidebar-panel-active">
          <div class="post-toc">

            
              
            

            
              <div class="post-toc-content"><ol class="nav"><li class="nav-item nav-level-1"><a class="nav-link" href="#RabbitMQ"><span class="nav-number">1.</span> <span class="nav-text">RabbitMQ</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#RabbitMQ简介"><span class="nav-number">1.1.</span> <span class="nav-text">RabbitMQ简介</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#RabbitMQ的使用"><span class="nav-number">1.2.</span> <span class="nav-text">RabbitMQ的使用</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#结束语"><span class="nav-number">1.3.</span> <span class="nav-text">结束语</span></a></li></ol></li></ol></div>
            

          </div>
        </section>
      <!--/noindex-->
      

      

    </div>
  </aside>


        
      </div>
    </main>

    <footer id="footer" class="footer">
      <div class="footer-inner">
        <script async src="https://busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script>
<div class="copyright">&copy; 2018 &mdash; <span itemprop="copyrightYear">2019</span>
  <span class="with-love">
    <i class="fa fa-user"></i>
  </span>
  <span class="author" itemprop="copyrightHolder">HUANGSM</span>

  
</div>









        
<div class="busuanzi-count">
  <script async src="https://dn-lbstatics.qbox.me/busuanzi/2.3/busuanzi.pure.mini.js"></script>

  
    <span class="site-uv">
      <i class="fa fa-user"></i>
      <span class="busuanzi-value" id="busuanzi_value_site_uv"></span>
      
    </span>
  

  
    <span class="site-pv">
      <i class="fa fa-eye"></i>
      <span class="busuanzi-value" id="busuanzi_value_site_pv"></span>
      
    </span>
  
</div>








        
      </div>
    </footer>

    
      <div class="back-to-top">
        <i class="fa fa-arrow-up"></i>
        
      </div>
    

    
      <div id="needsharebutton-float">
        <span class="btn">
          <i class="fa fa-share-alt" aria-hidden="true"></i>
        </span>
      </div>
    

  </div>

  

<script type="text/javascript">
  if (Object.prototype.toString.call(window.Promise) !== '[object Function]') {
    window.Promise = null;
  }
</script>









  












  
  
    <script type="text/javascript" src="/lib/jquery/index.js?v=2.1.3"></script>
  

  
  
    <script type="text/javascript" src="/lib/fastclick/lib/fastclick.min.js?v=1.0.6"></script>
  

  
  
    <script type="text/javascript" src="/lib/jquery_lazyload/jquery.lazyload.js?v=1.9.7"></script>
  

  
  
    <script type="text/javascript" src="/lib/velocity/velocity.min.js?v=1.2.1"></script>
  

  
  
    <script type="text/javascript" src="/lib/velocity/velocity.ui.min.js?v=1.2.1"></script>
  

  
  
    <script type="text/javascript" src="/lib/fancybox/source/jquery.fancybox.pack.js?v=2.1.5"></script>
  


  


  <script type="text/javascript" src="/js/src/utils.js?v=5.1.4"></script>

  <script type="text/javascript" src="/js/src/motion.js?v=5.1.4"></script>



  
  


  <script type="text/javascript" src="/js/src/affix.js?v=5.1.4"></script>

  <script type="text/javascript" src="/js/src/schemes/pisces.js?v=5.1.4"></script>



  
  <script type="text/javascript" src="/js/src/scrollspy.js?v=5.1.4"></script>
<script type="text/javascript" src="/js/src/post-details.js?v=5.1.4"></script>



  


  <script type="text/javascript" src="/js/src/bootstrap.js?v=5.1.4"></script>



  


  




	





  





  












  

  <script type="text/javascript">
    // Popup Window;
    var isfetched = false;
    var isXml = true;
    // Search DB path;
    var search_path = "search.xml";
    if (search_path.length === 0) {
      search_path = "search.xml";
    } else if (/json$/i.test(search_path)) {
      isXml = false;
    }
    var path = "/" + search_path;
    // monitor main search box;

    var onPopupClose = function (e) {
      $('.popup').hide();
      $('#local-search-input').val('');
      $('.search-result-list').remove();
      $('#no-result').remove();
      $(".local-search-pop-overlay").remove();
      $('body').css('overflow', '');
    }

    function proceedsearch() {
      $("body")
        .append('<div class="search-popup-overlay local-search-pop-overlay"></div>')
        .css('overflow', 'hidden');
      $('.search-popup-overlay').click(onPopupClose);
      $('.popup').toggle();
      var $localSearchInput = $('#local-search-input');
      $localSearchInput.attr("autocapitalize", "none");
      $localSearchInput.attr("autocorrect", "off");
      $localSearchInput.focus();
    }

    // search function;
    var searchFunc = function(path, search_id, content_id) {
      'use strict';

      // start loading animation
      $("body")
        .append('<div class="search-popup-overlay local-search-pop-overlay">' +
          '<div id="search-loading-icon">' +
          '<i class="fa fa-spinner fa-pulse fa-5x fa-fw"></i>' +
          '</div>' +
          '</div>')
        .css('overflow', 'hidden');
      $("#search-loading-icon").css('margin', '20% auto 0 auto').css('text-align', 'center');

      $.ajax({
        url: path,
        dataType: isXml ? "xml" : "json",
        async: true,
        success: function(res) {
          // get the contents from search data
          isfetched = true;
          $('.popup').detach().appendTo('.header-inner');
          var datas = isXml ? $("entry", res).map(function() {
            return {
              title: $("title", this).text(),
              content: $("content",this).text(),
              url: $("url" , this).text()
            };
          }).get() : res;
          var input = document.getElementById(search_id);
          var resultContent = document.getElementById(content_id);
          var inputEventFunction = function() {
            var searchText = input.value.trim().toLowerCase();
            var keywords = searchText.split(/[\s\-]+/);
            if (keywords.length > 1) {
              keywords.push(searchText);
            }
            var resultItems = [];
            if (searchText.length > 0) {
              // perform local searching
              datas.forEach(function(data) {
                var isMatch = false;
                var hitCount = 0;
                var searchTextCount = 0;
                var title = data.title.trim();
                var titleInLowerCase = title.toLowerCase();
                var content = data.content.trim().replace(/<[^>]+>/g,"");
                var contentInLowerCase = content.toLowerCase();
                var articleUrl = decodeURIComponent(data.url);
                var indexOfTitle = [];
                var indexOfContent = [];
                // only match articles with not empty titles
                if(title != '') {
                  keywords.forEach(function(keyword) {
                    function getIndexByWord(word, text, caseSensitive) {
                      var wordLen = word.length;
                      if (wordLen === 0) {
                        return [];
                      }
                      var startPosition = 0, position = [], index = [];
                      if (!caseSensitive) {
                        text = text.toLowerCase();
                        word = word.toLowerCase();
                      }
                      while ((position = text.indexOf(word, startPosition)) > -1) {
                        index.push({position: position, word: word});
                        startPosition = position + wordLen;
                      }
                      return index;
                    }

                    indexOfTitle = indexOfTitle.concat(getIndexByWord(keyword, titleInLowerCase, false));
                    indexOfContent = indexOfContent.concat(getIndexByWord(keyword, contentInLowerCase, false));
                  });
                  if (indexOfTitle.length > 0 || indexOfContent.length > 0) {
                    isMatch = true;
                    hitCount = indexOfTitle.length + indexOfContent.length;
                  }
                }

                // show search results

                if (isMatch) {
                  // sort index by position of keyword

                  [indexOfTitle, indexOfContent].forEach(function (index) {
                    index.sort(function (itemLeft, itemRight) {
                      if (itemRight.position !== itemLeft.position) {
                        return itemRight.position - itemLeft.position;
                      } else {
                        return itemLeft.word.length - itemRight.word.length;
                      }
                    });
                  });

                  // merge hits into slices

                  function mergeIntoSlice(text, start, end, index) {
                    var item = index[index.length - 1];
                    var position = item.position;
                    var word = item.word;
                    var hits = [];
                    var searchTextCountInSlice = 0;
                    while (position + word.length <= end && index.length != 0) {
                      if (word === searchText) {
                        searchTextCountInSlice++;
                      }
                      hits.push({position: position, length: word.length});
                      var wordEnd = position + word.length;

                      // move to next position of hit

                      index.pop();
                      while (index.length != 0) {
                        item = index[index.length - 1];
                        position = item.position;
                        word = item.word;
                        if (wordEnd > position) {
                          index.pop();
                        } else {
                          break;
                        }
                      }
                    }
                    searchTextCount += searchTextCountInSlice;
                    return {
                      hits: hits,
                      start: start,
                      end: end,
                      searchTextCount: searchTextCountInSlice
                    };
                  }

                  var slicesOfTitle = [];
                  if (indexOfTitle.length != 0) {
                    slicesOfTitle.push(mergeIntoSlice(title, 0, title.length, indexOfTitle));
                  }

                  var slicesOfContent = [];
                  while (indexOfContent.length != 0) {
                    var item = indexOfContent[indexOfContent.length - 1];
                    var position = item.position;
                    var word = item.word;
                    // cut out 100 characters
                    var start = position - 20;
                    var end = position + 80;
                    if(start < 0){
                      start = 0;
                    }
                    if (end < position + word.length) {
                      end = position + word.length;
                    }
                    if(end > content.length){
                      end = content.length;
                    }
                    slicesOfContent.push(mergeIntoSlice(content, start, end, indexOfContent));
                  }

                  // sort slices in content by search text's count and hits' count

                  slicesOfContent.sort(function (sliceLeft, sliceRight) {
                    if (sliceLeft.searchTextCount !== sliceRight.searchTextCount) {
                      return sliceRight.searchTextCount - sliceLeft.searchTextCount;
                    } else if (sliceLeft.hits.length !== sliceRight.hits.length) {
                      return sliceRight.hits.length - sliceLeft.hits.length;
                    } else {
                      return sliceLeft.start - sliceRight.start;
                    }
                  });

                  // select top N slices in content

                  var upperBound = parseInt('1');
                  if (upperBound >= 0) {
                    slicesOfContent = slicesOfContent.slice(0, upperBound);
                  }

                  // highlight title and content

                  function highlightKeyword(text, slice) {
                    var result = '';
                    var prevEnd = slice.start;
                    slice.hits.forEach(function (hit) {
                      result += text.substring(prevEnd, hit.position);
                      var end = hit.position + hit.length;
                      result += '<b class="search-keyword">' + text.substring(hit.position, end) + '</b>';
                      prevEnd = end;
                    });
                    result += text.substring(prevEnd, slice.end);
                    return result;
                  }

                  var resultItem = '';

                  if (slicesOfTitle.length != 0) {
                    resultItem += "<li><a href='" + articleUrl + "' class='search-result-title'>" + highlightKeyword(title, slicesOfTitle[0]) + "</a>";
                  } else {
                    resultItem += "<li><a href='" + articleUrl + "' class='search-result-title'>" + title + "</a>";
                  }

                  slicesOfContent.forEach(function (slice) {
                    resultItem += "<a href='" + articleUrl + "'>" +
                      "<p class=\"search-result\">" + highlightKeyword(content, slice) +
                      "...</p>" + "</a>";
                  });

                  resultItem += "</li>";
                  resultItems.push({
                    item: resultItem,
                    searchTextCount: searchTextCount,
                    hitCount: hitCount,
                    id: resultItems.length
                  });
                }
              })
            };
            if (keywords.length === 1 && keywords[0] === "") {
              resultContent.innerHTML = '<div id="no-result"><i class="fa fa-search fa-5x" /></div>'
            } else if (resultItems.length === 0) {
              resultContent.innerHTML = '<div id="no-result"><i class="fa fa-frown-o fa-5x" /></div>'
            } else {
              resultItems.sort(function (resultLeft, resultRight) {
                if (resultLeft.searchTextCount !== resultRight.searchTextCount) {
                  return resultRight.searchTextCount - resultLeft.searchTextCount;
                } else if (resultLeft.hitCount !== resultRight.hitCount) {
                  return resultRight.hitCount - resultLeft.hitCount;
                } else {
                  return resultRight.id - resultLeft.id;
                }
              });
              var searchResultList = '<ul class=\"search-result-list\">';
              resultItems.forEach(function (result) {
                searchResultList += result.item;
              })
              searchResultList += "</ul>";
              resultContent.innerHTML = searchResultList;
            }
          }

          if ('auto' === 'auto') {
            input.addEventListener('input', inputEventFunction);
          } else {
            $('.search-icon').click(inputEventFunction);
            input.addEventListener('keypress', function (event) {
              if (event.keyCode === 13) {
                inputEventFunction();
              }
            });
          }

          // remove loading animation
          $(".local-search-pop-overlay").remove();
          $('body').css('overflow', '');

          proceedsearch();
        }
      });
    }

    // handle and trigger popup window;
    $('.popup-trigger').click(function(e) {
      e.stopPropagation();
      if (isfetched === false) {
        searchFunc(path, 'local-search-input', 'local-search-result');
      } else {
        proceedsearch();
      };
    });

    $('.popup-btn-close').click(onPopupClose);
    $('.popup').click(function(e){
      e.stopPropagation();
    });
    $(document).on('keyup', function (event) {
      var shouldDismissSearchPopup = event.which === 27 &&
        $('.search-popup').is(':visible');
      if (shouldDismissSearchPopup) {
        onPopupClose();
      }
    });
  </script>





  

  

  

  
  
  
  <link rel="stylesheet" href="/lib/needsharebutton/needsharebutton.css">

  
  
  <script src="/lib/needsharebutton/needsharebutton.js"></script>

  <script>
    
      pbOptions = {};
      
          pbOptions.iconStyle = "box";
      
          pbOptions.boxForm = "horizontal";
      
          pbOptions.position = "bottomCenter";
      
          pbOptions.networks = "Weibo,Wechat,Douban,QQZone,Twitter,Facebook";
      
      new needShareButton('#needsharebutton-postbottom', pbOptions);
    
    
      flOptions = {};
      
          flOptions.iconStyle = "box";
      
          flOptions.boxForm = "horizontal";
      
          flOptions.position = "middleRight";
      
          flOptions.networks = "Weibo,Wechat,Douban,QQZone,Twitter,Facebook";
      
      new needShareButton('#needsharebutton-float', flOptions);
    
  </script>

  

  

  

  

</body>
</html>
